package com.itheima.pinda.web;

import com.itheima.j2cache.anno.Cache;
import com.itheima.j2cache.anno.CacheEvictor;
import com.itheima.pinda.entity.AddressBook;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * J2Cache的注解测试类
 *
 * @author llhuang10
 * @date 2021/10/7 22:30
 */
@Slf4j
@Api(tags = "J2Cache的注解测试类")
@RestController
@RequestMapping("/cache")
public class J2CacheController {

    /**
     * 测试类
     */
    @Cache(region = "addressBook", key = "ab", params = "id")
    @GetMapping("/detail")
    @ApiOperation("RequestParam String id")
    public AddressBook detail(String id) {
        AddressBook addressBook = AddressBook.builder()
                .id(id)
                .address("hefei")
                .build();
        log.info("------查询数据库.........");

        return addressBook;
    }

    /**
     * 从j2cache中获取缓存数据
     *
     * @return
     */
    @GetMapping("/getCacheData/{id}")
    @ApiOperation("PathVariable id")
    @Cache(region = "rx", key = "user", params = "id") // key最终拼接结果 key = user:123
    public List<String> getCacheData(@PathVariable(name = "id") String id) {
        //没有获取到缓存数据，需要从数据库中查询数据
        List<String> data = new ArrayList<>();
        data.add("beijing");
        data.add("nanjing");
        data.add("shanghai");
        System.out.println("查询数据库");

        return data;
    }


    /**
     * 从j2cache中获取缓存数据
     *
     * @return
     */
    @GetMapping("/getCacheDataBody")
    @ApiOperation("RequestBody Json body")
    @Cache(region = "rx", key = "user", params = "0.name")  // 0.name -> 代表第一个参数
    public List<Map> getCacheDataBody(@RequestBody Map body) {
        //没有获取到缓存数据，需要从数据库中查询数据
        List<Map> data = new ArrayList<>();
        data.add(body);
        System.out.println("查询数据库");
        return data;
    }


    /**
     * 从j2cache中获取缓存数据
     *
     * @return
     */
    @GetMapping("/getCacheDataParams")
    @ApiOperation("RequestParam Map params")
    @Cache(region = "rx", key = "user", params = "0.name")
    public List<Map> getCacheDataParams(@RequestParam Map params) {
        //没有获取到缓存数据，需要从数据库中查询数据
        List<Map> data = new ArrayList<>();
        data.add(params);
        System.out.println("查询数据库");
        return data;
    }

    @GetMapping("/getAllData")
    @ApiOperation("从j2cache中获取所有缓存数据")
    @Cache(region = "rx", key = "users")    // key = users
    public List<String> getAllData() {
        //没有获取到缓存数据，需要从数据库中查询数据
        List<String> data = new ArrayList<>();
        data.add("beijing");
        data.add("nanjing");
        data.add("shanghai");
        System.out.println("查询数据库");
        return data;
    }

    /**
     * 清理指定region中key的缓存数据
     *
     * @return
     */
    @CacheEvictor({@Cache(region = "rx", key = "user", params = "id")})
    @GetMapping("/evict/{id}")
    @ApiOperation("清理指定key的缓存数据")
    public String evict(@PathVariable(name = "id") String id) {
        System.out.println("删除数据库");
        return "evict success";
    }

    /**
     * 清理指定region中key的缓存数据
     * . @Cache注解的参数 param没有填写, 那么key就是为  rx:key
     *
     * @return
     */
    @CacheEvictor({@Cache(region = "rx", key = "user")})
    @GetMapping("/evict")
    @ApiOperation("清理指定key的缓存数据02")
    public String evict02() {
        System.out.println("删除数据库");
        return "evict success";
    }

    /**
     * 清理指定region的缓存数据
     *
     * @return
     */
    @CacheEvictor({@Cache(region = "rx")})      // @Cache只传入一个region, 就表示删除region区域中的所有缓存数据
    @GetMapping("/clear")
    @ApiOperation("清理指定region的缓存数据")
    public String clearAll() {
        System.out.println("删除数据库");
        return "clear success";
    }
}
